package com.ruoyi.sqlbuilder.execute.convert;

import com.ruoyi.sqlbuilder.domain.Columns;
import com.ruoyi.sqlbuilder.domain.KeyColumnUsage;
import com.ruoyi.sqlbuilder.domain.Statistics;
import com.ruoyi.sqlbuilder.vo.SqlHandleVo;

import java.util.List;
import java.util.Map;

/**
 * sql转换器接口
 *
 * @author Yanzy
 */
public interface ISqlHandler {

    /**
     * 获取数据库中的表信息
     *
     * @param params 传输实体
     * @return vo
     */
    List<String> selectTables(SqlHandleVo params);

    /**
     * 查询表对应的字段
     *
     * @param params    传输实体
     * @param tableName tableName
     * @return columns
     */
    List<Columns> selectTableColumns(SqlHandleVo params, String tableName);

    /**
     * 查询表对应的数据
     *
     * @param columns 对应字段集合
     * @param params 传输参数实体
     * @param tableName 表名
     * @return filePath
     */
    String selectTableValues(List<Columns> columns,SqlHandleVo params, String tableName, String filePath);

    /**
     * 查询并处理外键数据 返回sql
     * @param params 查询参数
     * @param tableName 表名
     * @return sqlList
     */
    List<String> selectAndHandleForeignKey(SqlHandleVo params, String tableName);

    /**
     * 查询并处理索引
     * @param params 查询条件
     * @param tableName 表名
     * @return sqlList
     */
    List<String> selectAndHandleIndex(SqlHandleVo params, String tableName);

    /**
     * 创建table sql 头部
     *
     * @param tableName   table名称
     * @param tableSchema 表架构
     * @return sql
     */
    String createTableHead(String tableName, String tableSchema);

    /**
     * 创建table sql 身体部分
     *
     * @param columns 字段
     * @return sql
     */
    String createTableBody(List<Columns> columns);

    /**
     * 创建table时 特殊需求, 目前仅瀚高使用, 有其他情况拓展
     * @param columns 字段
     * @return sql
     */
    String createTableSpecial(List<Columns> columns);

    /**
     * 处理字段类型组装sql
     *
     * @param columns 字段
     * @return sql
     */
    String handleColumnType(Columns columns);

    /**
     * 处理字段精度
     *
     * @param columns 字段
     * @return sql
     */
    String handlePrecision(Columns columns);

    /**
     * 处理字段 是否可以为空
     *
     * @param columns 字段
     * @return not null
     */
    String handleNotNullPre(Columns columns);

    /**
     * 处理字段 默认值
     *
     * @param columns 字段
     * @return default value
     */
    String handleDefaultValue(Columns columns);

    /**
     * 处理创建主键
     *
     * @param primaryKeys 主键集合
     * @return PRIMARY KEY
     */
    String handlePrimaryKey(List<String> primaryKeys);

    /**
     * 处理行数据 -> sql
     * @param columns 所有列
     * @param values 所有列对应的值
     * @param tableName 表名
     * @return sql
     */
    String handleTableValue(List<Columns> columns, Map<String, Object> values, String tableName);

    /**
     * 插入语句头部
     * @param tableName 表名
     * @return sql
     */
    String handleInsertHead(String tableName);

    /**
     * 插入语句尾部
     * @param tableName 表名
     * @return sql
     */
    String handleInsertFoot(String tableName);

    /**
     * 处理外键
     * @param keyColumnUsage 外键对象
     * @return sql
     */
    String handleForeignKey(KeyColumnUsage keyColumnUsage);

    /**
     * 处理索引
     * @param statistics 索引对象
     * @return sql
     */
    String handleIndex(Statistics statistics);

    /**
     * 处理多索引
     * @param statistics 索引集合
     * @return sql
     */
    String handleIndexList(List<Statistics> statistics);
}
